{
	// \u0061 Unicode表示法
	console.log('a','\u0041');// a  A
	// \u00415已经超过了\uFFFF ,会按照两个字符处理 \u0041与5
	console.log('a','\u20BB7'); // a ₻7
	// 使用{} 当做一个码值
	console.log('s','\u{20BB7}')   // s  𠮷
}

{
	//获取字符串第一个字符的编码码值     codePointAt:ES6新增API
	let a='侯征';
	console.log('第一个字符',a.charAt(0)); // 取第一个位置的字符  : 侯
	console.log('--十进制码值--',a.codePointAt(0)); // 20399
	console.log('--十六进制码值--',a.codePointAt(0).toString(16)); //4faf
	/*
	 * codePointAt在第一个字符是特殊字符时,即超过两个字节,会当做一个字符取码值,
	 * 取第二个字符时则会取后两个字节的码值,保持完整
	 * 而es5中的API charCodeAt() 只会取两个字节的码值,超过两个会当做两个字符,不会取完整
	 */
	let s='𠮷';//码值大于\uFFFF    𠮷:四个字节
	console.log(s.length); //长度为2
	console.log(s.charCodeAt(0).toString(16)); 
	console.log(s.charCodeAt(1).toString(16));
}

{
	console.log(String.fromCharCode('0x20bb7'))   // 乱码,无法处理超过两个字节的字符
	console.log(String.fromCodePoint('0x20bb7'))  // 𠮷
	
	let str='\u{20bb7}123';
	//es5遍历字符串
	for(let i=0;i<str.length;i++){
		console.log('es5',str[i]); // 乱码 乱码 1 2 3
	}
	//es6遍历字符串,能处理大于两个字节的字符1
	for(let code of str){ //字符串遍历器
		console.log('es6',code)   // 𠮷  1 2 3
	}
}


{
	let str='string';
	console.log(str.includes("c")); //是否包含字符c
	console.log(str.startsWith("st")); //是否以st开头
	console.log(str.endsWith("ng"));  //是否以ng结尾
	console.log(str.repeat(3));   //重复3次  参数表示次数
}

{
	let name="侯征";
	let age=23;
	//  ``模板字符串   必须使用 ``符号包含,${}里面写变量
	let m=`我的名字是${name},我今年${age}了`;
	console.log(m); //我的名字是侯征,我今年23了
}

{
	let user={
		name:'houzheng',
		age:23
	}
	//标签模板  : abc表示函数名,模板字符串表示参数  ,打印的结果是函数的返回值
	console.log(abc`i am ${user.name} and i am ${user.age} now`);//   i am , and i am , nowhouzheng23
	function abc(s,v1,v2){ //s表示出了变量之外的字符,以变量分隔成数组元素
		//v1表示第一个变量,v2表示第二个变量
		return s+v1+v2;
	}
	//标签模板常常用来过滤html,以及处理多语言模板
	
	//raw对字符串中转义字符进行了处理,使其变为正常字符输入,即前面加\
	console.log(String.raw`hi\n${1+2}`); //hi\n3
	console.log(`hi\n${1+2}`);   //hi
	                             //3
}
